package cn.mujiankeji.mbrowser.app

// import cn.mujiankeji.mbrowser.功能.仓库接口.基础仓库接口 // 移除
// import cn.mujiankeji.mbrowser.数据.仓库.基础仓库实现 // 移除
// import cn.mujiankeji.mbrowser.界面.ViewModel.主浏览器ViewModel // 移除
import android.os.Build
import androidx.annotation.RequiresApi
import cn.mujiankeji.mbrowser.功能.下载.下载管理器接口
import cn.mujiankeji.mbrowser.功能.下载.下载管理器实现
import cn.mujiankeji.mbrowser.功能.下载.仓库.下载仓库接口
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp // 示例引擎
import io.ktor.client.plugins.compression.ContentEncoding
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation // 示例插件
import io.ktor.serialization.kotlinx.json.json // 示例序列化
import kotlinx.serialization.json.Json
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module
import java.time.Duration
import java.util.concurrent.TimeUnit

/**
 * Koin 模块，用于声明应用程序级别的依赖项。
 */
val appModule = module {

    // 数据库
    single { AppDatabase.获取实例(androidContext()) }

    // 界面操作
    single { 界面模块(get()) }


    // HttpClient (如果还没有在别处定义)
    single<HttpClient> {
        HttpClient(OkHttp) {
            // 超时设置
            engine {
                config {
                    connectTimeout(60, TimeUnit.SECONDS)
                    readTimeout(120, TimeUnit.SECONDS)
                    writeTimeout(120, TimeUnit.SECONDS)

                }
            }
            install(io.ktor.client.plugins.HttpTimeout) {
                requestTimeoutMillis = 120_000
                connectTimeoutMillis = 60_000
                socketTimeoutMillis = 120_000
            }
            install(ContentNegotiation) {
                // JSON 序列化
                json(Json {
                    prettyPrint = true
                    isLenient = true
                    ignoreUnknownKeys = true
                })
            }
            install(ContentEncoding){
                gzip()
                deflate()
            }
        }
    }

    // 下载管理器
    single<下载仓库接口> {
        下载模块(get<AppDatabase>().下载())
    }
    single<下载管理器接口> {
        下载管理器实现(
            context = androidContext(),
            下载仓库 = get(),          // Koin 会自动注入已定义的 下载仓库接口
            httpClient = get()         // Koin 会自动注入已定义的 HttpClient
        )
    }
}